Índice
- Tarea 1
- Tarea 1 parte b
- Tarea 2
- Tarea 2 parte a y b
- Tarea 2 parte c opcional 1
- Tarea 2 parte c opcional 2
- Tarea 3
- Tarea 3 opcional 1
- Tarea 3 opcional 2
- Tarea 3 opcional 3
Tarea 1
Parte a)
Elijan tres visualizaciones entre aquellas disponibles en:
- https://visme.co/blog/best-data-visualizations/
- https://vcg.informatik.uni-rostock.de/~ct/timeviz/timeviz.html
Describa aspectos objetivos y subjetivos de las visualizaciones, como ser:
- Qué información se muestra, sus propiedades principales y qué elementos de apoyo visual se utilizan para describir graficamente esa información (barras de distinto largo, colores, objetos de distinta forma, tamaño y posición, etc.).
- Explique el grado de facilidad/dificultad de comprensión por parte del usuario: (Ejemplos de información que salta a la vista y de información que hay que buscar/analizar, etc.)
Universo Marvel
Esta visualización interactiva del estilo grafo muestra las conexiones entre los personajes y las películas dentro del universo cinematográfico de Marvel.
Utiliza viñetas circulares con el avatar del personaje dentro y los relaciona entre sí con líneas de distintos colores en función del vínculo que tienen: amigo, enemigo, creación, familia, trabajo, romance y alter ego. La visualización puede ser filtrada en función del grupo (héroe, vengador, etc.) al que pertenece el personaje o también por película.
En tanto, brinda información detallada (ficha técnica) de cada personaje que incluye datos básicos del personaje: nombre, alias, status y actor, además una breve descripción de su rol dentro de la/s película/s así como también todas las relaciones que tiene con otros personajes.
La visualización es de muy fácil interpretación, basta con seguir las líneas de relaciones para entender los vínculos entre los personajes y/o hacer click sobre una viñeta para que despliegue la ficha técnica.
La visualización se organiza con semicircunferencias (anillos) en función de agrupaciones, suponemos que dichas agrupaciones son en función de la distancia que tiene cada luna de Júpiter, pero no hay ninguna especificación al respecto.
Las lunas son representadas con circunferencias las cuales varía de tamaño y se agrupan en 5 rangos: de 1 a 4km, de 5 a 10km, de 11 a 50km, de 51 a 100km, de 101 a 1000km. Además, tienen diferentes colores según su categoría, si son satélites regulares o irregulares y al grupo que pertenecen; y se incluyen 3 datos de cada luna: su año de descubrimiento, nombre de la luna y el nombre de quien las descubrió.
Se trata de una visualización también de fácil interpretación, que utiliza colores y tamaños de forma clara.
Los mapas de flujo salen de un punto de origen y ramifican sus «líneas de flujo». Las flechas se pueden usar para mostrar la dirección, o si el movimiento es entrante o saliente. Sin las flechas se puede utilizar para representar el comercio que va y viene. Combinar/agrupar las líneas de flujo y evitar los cruces puede ayudar a reducir el desorden visual en el mapa.
Los diagramas de flujo ayudan a la comprensión del proceso al mostrarlo con un dibujo ya que el cerebro humano reconoce fácilmente los dibujos. Nos permite identificar los errores y nos da la oportunidad de alegrarlo y mejorar el proceso. Además, es fácil identificar los procesos ya que muestra las interfaces de cliente a proveedor y muestra las transacciones que se realizan.
Como desventaja, algunos diagramas complejos pueden ser muy laboriosos durante la planificación y el diseño del mismo. Por lo que puede ser difícil el seguimiento si el diagrama tiene diferentes caminos. Y tampoco hay normas fijas para la elaboración de los diagramas de flujos.
Parte b)
Busquen ejemplos de gráficos mal diseñados y expliquen por qué lo están, así como una propuesta alternativa para su mejora. Como ejemplo pueden buscar en: https://www.buzzfeednews.com/article/katienotopoulos/graphs-that-lied-to-us
La hoja siguiente pertence a una página de un informe elaborado por un Organismo del Estado. Refieren a los costos en el transporte de pasajeros por carretera.
Costos en el transporte de Pasajeros por Carretera
En primer lugar cabe destacar que no dice el año al que hace referencia. A su vez, para el IMS se usa como base julio del 2008 y para el IPC la base es diciembre del 2010. Otro error es que se insertan 2 referencias y dentro de las mismas se refieren a varias cosas. En todo caso, se podrían haber puesto más referencias.
Gráfica superior es un gráfico de barras donde se intenta mostrar la evolución mensual del precio del gasoleo (sin saber para qué año). Al ver la gráfica uno ve 6 barras lo que lleva a pensar que es bimensual y el error sería el título (Evolución mensual), pero no, la unión de meses está dada por la igualdad de las magnitudes, es así que enero está solo porque el precio es 38.2 mientras que de febrero a junio el precio fue 37.7, etc, por lo que la cantidad de barras no responde a meses sino a valores de precios de gasoleos distintos en el año. Esto hace que a simple vista uno no ve que el precio del gasoleo se mantuvo constante durante tantos meses. Tampoco se especifica la moneda en ninguna parte de la página.
Otro problema observado es la escala y sobre todo su comienzo, el piso es 36.5. Es así que a golpe de vista la barra verde parecería ser la mitad de la amarilla y sus magnitudes son: el verde corresponde a julio con un valor de gasoleo de 37,86 mientras que la barra amarilla son los meses de agosto a setiembre con un valor de 39,60.
No tiene los nombres de los ejes ni el título del gráfico bien definido y ni hablar del efecto 3D. Tampoco es muy lindo el colormaps
Gráfica inferior es un gráfico tipo torta y suponemos intenta mostrar la evolución mensual del IPC en ese año.
Presenta varios problemas, como ser:
- No tiene título en sí mismo.
- Mala elección del tipo de gráfico, se intenta mostrar una evolución con un gráfico de tortas.
- A golpe de vista, se pensaría que las magnitudes de las porciones de abajo (amarillo, fuccia y rojo) serían las más grandes y no lo son. Deberían estár las variaciones no los valores absolutos de IPC.
Por otro lado, el efecto 3D tampoco ayuda. Una muy mala elección por dónde se lo mire, desde qué mostrar, tipo de gráfico, etc.
Un tercer gráfico presentado como erróneo es una serie que trata de mostrar el desempleo entre el 2007 al 2014.
Gráfica de Desempleo en España
El gráfico fue presentado intentando mostrar el “descenso” en el desempleo.
En primer lugar a simple vista la pendiente de la recta en la suba del año 2007 al 2009 (de 2.129.547 a 4.100.073) parece ser casi igual al aumento del 2009 al 2012 (4.100.073 a 4.848.723), cuando esos incrementos son notoriamente distintos.
Por otro lado, termina mostrando un descenso del paro abrupto que logra una magnitud menor que la registrada en 2009, siendo realmente mayor en 2014 (4.447.711) que en 2009 (4.100.073).
Con respecto a la parte estética, el sombredo hace que se distinga menos, lo cual pudo haber sido a propósito. Los recuadros blancos para títulos y fuentes desentonan, así como el tamaño de la Fuente, lo que hace pensar que también pudo haber sido a propósito para que a golpe de vista se piense que es información presentada por el Ministerio.
Tarea 2 (Diseño y propuesta de visualizaciones)
Exploren las propuestas de visualizaciones encontradas en https://datavizcatalogue.com/. Describa un subconjunto de visualizaciones que sean fáciles de realizar en Octave y un subconjunto que implique mayor trabajo de programación.
Implementen en Octave media docena de las visualizaciones fáciles teniendo cuidado de los aspectos estéticos. Entreguen el código y una breve descripción de la tarea realizada.
Elegir una de las siguientes actividades opcionales:
Actividad Opcional 1: Implementen en Octave alguna visualización de la parte a) que no sea realizable directamente con unos pocos comandos, sino que impliquen un trabajo mayor de programación.
Actividad Opcional 2: Exploren las visualizaciones disponibles en:
Realicen una propuesta o esquema de visualización, para datos propios o de terceros (ver ejercicio 3), donde se incluyan algunas de las visualizaciones expresadas en los links anteriores, o en su defecto una propuesta propia, que incorpore los conceptos vistos en el curso.
Tarea 2.1) y 2.2)
Stream Graph
Un gráfico de flujo es un tipo de gráfico de área apilada. Muestra la evolución de un valor numérico (eje Y) después de otro valor numérico (eje X). Esta evolución está representada por varios grupos, todos con un color distinto.
Contrariamente a un área apilada, no hay esquina: los bordes son redondeados, lo que genera la impresión de flujo. Además, las áreas generalmente se desplazan alrededor de un eje central, lo que da como resultado una forma fluida.
babynames %>%
filter(grepl(paste0("^",expLetras), name)) %>%
group_by(year, name) %>%
summarise(nn = sum(n)) %>%
# filter(nn > 500) %>%
streamgraph("name", "nn", "year", interpolate="cardinal") %>%
sg_legend(show=TRUE, label=paste0(expLetras,"- Nombres: "))Evolución de los nombres que empiezan con la letras: I
Este diagrama de flujos muestra la evolución desde el año 1880 al 2017 de la frecuencia de los nombres que comienzan con la letra I. Es un gráfico interactivo donde cada flujo, diferenciado por color, se asocia a un nombre específico. Si se hace click en un determinado punto de gráfico se resalta el fllujo del nombre asociado a ese color y se despliega en la pantalla el nombre asociado y la frecuencia que se observó en ese año en particular. Por otro lado es posible seleccionar un nombre específico del menú deplegable.
Word Cloud
Una nube de puntos es un método de visualización que muestra con qué frecuencia aparecen las palabras en un cuerpo de texto dado, haciendo que el tamaño de cada palabra sea proporcional a su frecuencia. Todas las palabras se ordenan en un grupo o nube de palabras. Alternativamente, las palabras también se pueden organizar en cualquier formato: líneas horizontales, columnas o dentro de una forma.
El color utilizado en las nubes de palabras generalmente no tiene sentido y es principalmente estético, pero se puede utilizar para clasificar palabras o mostrar otra variable de datos.
dat = read.table('Bases/wordCloud.csv',header = T,sep = ';',dec = ',')
#dat = dat[!duplicated(dat[,'Ocupacion']),]
pal <- brewer.pal(8,"Dark2")
# pal <- pal[-(1)]
pal <- brewer.pal(9,"BuGn")
pal <- pal[-(1:3)]
wordcloud(dat[,'Ocupacion'], dat[,'Frecuencia'],
scale = c(3,.5),
min.freq = 2,,random.order = F,random.color = F,rot.per = 0,colors = pal)Otras actividades que hacen los docentes. Fuente: INEED
La nube de puntos muestra otras actividades que declaran realizar los docentes de Secundaria Privada, Secundaria Pública y Escuelas Técnicas. Hay actividades que se repiten porque la información está para todos los centros y la idea era realizar una nube para cada uno. El tamaño y la intensidad del color depende de la frecuencia con la que se repite la palabra.
BARPLOT
A diferencia de un gráfico de barras simple que muestra sus barras una al lado de la otra, los gráficos de barras apiladas segmentan sus barras de conjuntos de datos múltiples uno encima del otro. Se utilizan para mostrar cómo se divide una categoría más grande en categorías más pequeñas y cuál es la relación de cada parte con la cantidad total.
Hay dos tipos de gráficos de barras apiladas:
- Gráfico de barras apiladas simples: éstos colocan cada valor para el segmento después del anterior. El valor total de la barra es todos los valores de segmento agregados juntos. Ideal para comparar las cantidades totales en cada grupo \(/\) barra segmentada.
- Gráficos de barras del 100% de la pila: muestran el porcentaje del total de cada grupo y se representan mediante el porcentaje de cada valor con respecto a la cantidad total de cada grupo. Esto facilita ver las diferencias relativas entre cantidades en cada grupo.
######################################
#### CONSTRUYE LOS DATOS
load('Bases/Datos_Estudiantes_CXTO_6TO.RData')
######################################
#### ARMA TABLA
dat = Indices %>% filter(Niveles_MAT != '9999')
cc = table(dat$Niveles_MAT,dat$ESCS_Centro_cat)
cc = as.data.frame.matrix(round(100*prop.table(cc,2),1))
df = cbind(VarCat = rownames(cc),cc)
rownames(df) = as.character(df[,'VarCat'])
dfaux = cbind(df,Max = apply(df[,!names(df) %in% 'VarCat'],1,max))
dfaux$Min = c(0,dfaux$Max[1:(length(dfaux$Max)-1)])
dfaux$ymin = cumsum(dfaux$Min)
LevelsLab = colnames(df)[!colnames(df) %in% 'VarCat']
dfFin = melt(dfaux[,c(names(df),'ymin')],id = c('VarCat','ymin'))
rownames(dfFin) = paste(dfFin[,'VarCat'],dfFin[,'variable'])
dfFin[,'variable'] = factor(dfFin[,'variable'],levels = LevelsLab)
dfFin$X = as.numeric(dfFin$variable)
dfFin$xmin = dfFin$X - 0.4
dfFin$xmax = dfFin$X + 0.4
dfFin$ymax = dfFin$value + dfFin$ymin
dfFin$coorYlab = dfFin$ymin + (dfFin$ymax - dfFin$ymin)/2
dfFin$Lab = paste0(format(round(dfFin$value,1),decimal = ','),'%')###################################
####
textLabSize = 4
text_Y_LabSize = 12
angle = 0
##### GRAFICO
pp = ggplot(dfFin,aes(xmin = xmin,xmax = xmax, ymin = ymin, ymax = ymax,fill = VarCat)) +
geom_rect() +
coord_flip() +
theme_minimal() +
scale_x_continuous(breaks=unique(dfFin$X),labels = levels(dfFin$variable)) +
geom_text(aes(x = X, y = coorYlab, label = Lab),size = textLabSize) +
theme(axis.line=element_blank()) +
theme(panel.grid.minor.x=element_blank(),
panel.grid.major.x=element_blank(),
axis.title.x = element_blank(),
axis.text.x = element_blank(),
axis.title.y = element_blank(),
axis.text.y = element_text(size=text_Y_LabSize,angle = angle,hjust = 0,vjust = 0)) +
theme(legend.position = 'top') +
scale_fill_manual(name = 'Nivel desempeño\nMatemática',values = c('#b70000','#ff3f3f','#ff9224','#dbdb00','#00b700'))
ppNivel de desempeño en Matemáticas según quintil de ingreso. Fuente: INEED
Este es un gráfico de barras horizontales disjuntas que muestra para cada quintil de ingreso el porcentaje de la población en cada uno de los niveles de desempeño en matemáticas, medido como rangos de puntajes en una escala. La idea de las barras disjuntas ayuda a visualizar la diferencias entre los quintiles (por esto mismo no se utilizan barras apiladas). Se busca hacer foco en la comparación del porcentaje dentro de cada nivel entre los quintiles. Se trató de elegir colores correspondientes a lo mostrado, como ser, los niveles de desempeño más bajos tienen colores <
VIOLIN
Un diagrama de violín se utiliza para visualizar la distribución de los datos y su densidad de probabilidad. Este gráfico es una combinación de un diagrama de caja y un diagrama de densidad que se gira y coloca a cada lado para mostrar la forma de distribución de los datos.
data = data.frame(valor = c(rnorm(200),rnorm(200)*0.7 + 1),Tratamiento = rep(c('A','B'),each = 200))
colores = c("#E69F00", "#56B4E9")
ggplot(data, aes(x=Tratamiento, y=valor, fill=Tratamiento)) +
geom_jitter(aes(color = Tratamiento),width = 0.4, alpha = 0.5, size = 1) +
geom_violin(
trim = FALSE,
draw_quantiles = c(0.25, 0.5, 0.75),
alpha = 0.7) +
theme_bw() +
scale_colour_manual(name = 'Tratamiento',values = colores) +
scale_fill_manual(name = 'Tratamiento',values = colores) +
ylab('Variable de interes') +
theme(axis.text.x = element_text(angle = 0, hjust = 0.5,size = 10, face = 'bold'),
legend.position = 'none')Se utilizan datos simulados asumiendo que existen un tratamiento A y un tratamiento B y que se quiere comparar la distribución. Además de mostrar el digrama de violín para cada distribución según tratamiento se grafican los puntos con una perturbación para tener mejor idea de dónde están ubicados . A su vez se incorporó la mediana y los percentiles 25 y 75 (como referencia).
DENSIDAD
Un diagrama de densidad visualiza la distribución de datos en un intervalo continuo o período de tiempo. Este gráfico es una variación de un histograma que utiliza el suavizado del núcleo para trazar valores, lo que permite distribuciones más uniformes al suavizar el ruido. Los picos de un gráfico de densidad ayudan a mostrar dónde se concentran los valores durante el intervalo.
ggplot(data,aes(x = valor, fill = Tratamiento)) +
geom_density(alpha = 0.4) + xlim(-3.5,3.5) +
theme_minimal() +
ylab('Densidad') + xlab('Variable de interes') +
scale_fill_manual(name = 'Tratamiento',values = colores) +
theme(axis.text.x = element_text(size = 10, face = 'bold'),
axis.text.y = element_text(size = 10, face = 'bold'),
legend.position = 'top')Se muestra otra posible visualización de las densidades para los datos simulados en la parte anterior.
Scatterplot
Los diagramas de dispersión utilizan una colección de puntos colocados mediante coordenadas cartesianas para mostrar valores de dos variables. Al mostrar una variable en cada eje, puede detectar si existe una relación o correlación entre las dos variables.
Se pueden interpretar varios tipos de correlación a través de los patrones que se muestran en los Diagramas de dispersión. Estos son: positivo (los valores aumentan juntos), negativo (un valor disminuye a medida que aumenta el otro), nulo (sin correlación), lineal, exponencial y en forma de U.
n = 150
x = rnorm(n)
y = -1 + x + x^2 + x^3 + rnorm(n)/0.3
y2 = 3 + x - x^2 + x^3 + rnorm(n)/0.3
Tratamiento = rep(c('A','B'),each = n)
datos = data.frame(X = c(x,x), Y = c(y,y2),Tratamiento = Tratamiento)
colores = c("#E69F00", "#56B4E9")
ggplot() +
geom_point(data = datos,aes(x = X, y = Y,color = Tratamiento,shape = Tratamiento),size = 2,alpha = 0.5) +
# geom_smooth(data = datos,aes(x = X, y = Y),se = F) +
geom_smooth(data = datos,aes(x = X, y = Y,color = Tratamiento),se = F) +
theme_minimal() +
scale_color_manual(name = 'Población',values = colores) +
scale_shape_manual(name = 'Población',values = c(17,19)) +
theme(axis.text.x = element_text(size = 10, face = 'bold'),
axis.text.y = element_text(size = 10, face = 'bold'),
legend.position = 'top')Se simulan datos 150 realizaciones de una \(N(0,1)\) y se asume que existen dos poblaciones \(A\) y \(B\). Para cada población se le genera una relación funcional con respecto a \(X\) como se muestra en las ecuaciones:
\[ Y_A(X) = -1 + X + X^2 + X^3 \\ Y_B(X) = 3 + X - X^2 + X^3 \]
En el gráfico se muestra como quedan representados los puntos en el plano distinguiendo con colores a cada punto según la población a la que pertenece. Además se agregan curvas de ajuste no paramétrico que estiman la relación funcional entre \(X\) e \(Y\) para dada una de las poblaciones.
Tarea 2.3)
Actividad opcional 1
Como propuesta de visualización no sencilla, se muestra una pirámide poblacional por sexo según grado de dificultad para ver. Se utiliza la base de discapacidad de un estudio realizado en la Intendencia de Montevideo.
La pirámide poblacional es un gráfico de barras horizontales cuya longitud es proporcional a la cantidad (porcentaje como en este caso) de personas en cada rango etáreo según sexo. Se podría decir que es son dos gráficos de barras horizontales, uno para mujeres y otro para hombres.
Al tener toda la información junta permite ver no sólo las magnitudes de cada sexo por rango etáreo sino la comparación entre ellos.
En general se toman rangos quinquenales de edad y a la derecha se sitúan las mujeres y a la izquierda los hombres. La ventaja de mostrar el gráfico en porcentajes es comparativa ya sea en distinto lugar como tiempo.
load('Bases/datosPiramide.RData')
dat = dfAux
dfRect = dat[dat$Var2 == levels(dat$Var2)[length(levels(dat$Var2))] & dat$VarCruce == dat$VarCruce[1],]
agAux = aggregate(dat[,c('value','valueInc')],by = list(dat$Var1,dat$VarCruce),FUN = 'sum')
agAux$Label = format(abs(agAux$value),decimal = ',')
colnames(agAux) = c('Var1','Var2','value','valueInc','Label')
agAuxSplit = split(agAux,agAux$Var2)
agAuxSplit[[1]]$Var2 = levels(dat$Var2)[1]
agAuxSplit[[2]]$Var2 = levels(dat$Var2)[1]
Max = max(abs(agAux$value))
totMax = Max + 5
Limite = 10*(floor(Max/10) + 2)
Limite = max(30,Limite)
yAnotate = Limite/2
sizeLabelPorc = 2
sizeGrillaLab = 2.5
Inc = 5
dfRect$grillaLab[grep('85,',dfRect$grillaLab)] = '85 o +'
ggplot(dat, aes(x = Var1, y = valueInc, fill = Var2)) +
geom_bar(stat = "identity",alpha = 0.7) +
scale_y_continuous(breaks = c(seq(-(100 + Inc), -Inc, 10),seq(Inc, (100 + Inc), 10)),
labels = paste0(as.character(c(seq(100, 0, -10), seq(0, 100, 10))), "%"),
limits = c(-Limite,Limite)) +
geom_rect(aes(xmin = 0, xmax = Inf,ymin = -Inc,ymax = Inc),fill = 'white') +
geom_text(data = dfRect,aes(y = coordGrilla,label = grillaLab),
size = sizeGrillaLab,hjust = 0.5,vjust = 0.5) +
geom_text(aes(x = Var1,y = coordPorc, label = LabelPorc),
size = sizeLabelPorc) +
geom_text(data = agAuxSplit[[1]],aes(x = Var1 ,y = totMax, label = Label),
size = (sizeLabelPorc + 0.5),hjust = -1) +
geom_text(data = agAuxSplit[[2]],aes(x = Var1 ,y = -totMax, label = Label),
size = (sizeLabelPorc + 0.5),hjust = 1.5) +
ggplot2::annotate(geom='text',x = 1,y = -yAnotate,label = 'Hombres',hjust = 0.5,size = 6) +
ggplot2::annotate(geom='text',x = 1,y = yAnotate,label = 'Mujeres',hjust = 0.5,size = 6) +
coord_flip() +
theme_minimal() +
theme(axis.text.y = element_blank(),
axis.title.y = element_blank(),
axis.ticks.y = element_blank(),
axis.line.y = element_blank(),
axis.title.x = element_blank(),
legend.position = 'top') +
scale_fill_brewer(name = '',palette = "Set1") La idea es usar como base una pirámide poblacional pero con el agregado de que en cada rango etáreo se discrimina por el grado de dificultad visual. El color rojo (como alerta) representa los que no pueden ver mientras que en verde están aquellos que tienen alguna dificultad. Además se agregan en los márgenes laterales de la pirámide los porcentajes totales de personas con alguna discapacidad visual (sin importar el grado), tanto para hombres como para mujeres. A su vez se agrega como fondo la grilla con intervalo de 10% para rango de edad para ayudar a visualizar las diferencias.
Trabajo opcional 2)
Se muestra un mapa interactivo utilizando como insumo la librería leaflet de R combinada con cartografía disponible en http://sig.montevideo.gub.uy/. Y se incorpora la información de la Encuesta Contínua de Hogares 2018 (INE) http://www.ine.gub.uy/encuesta-continua-de-hogares1 .
ccz = read_sf('SHP/sig_comunales/sig_comunales.shp')
## EDU INICIAL
edu_inicial = read_sf('SHP/edu_inicial/edu_inicial.shp')
## EDU PRIMARIA
edu_primaria = read_sf('SHP/edu_primaria/edu_primaria.shp')
## EDU SECUNDARIA
edu_secundaria = read_sf('SHP/edu_secundaria/edu_secundaria.shp')
## EDU TERCIARIA
edu_terciaria = read_sf('SHP/edu_terciaria/edu_terciaria.shp')
####### CAMBIO LAS GEOMETRIAS A LATITUD Y LONGITUD
st_crs(ccz) = 32721
st_geometry(ccz) = st_transform(st_geometry(ccz), 4326)
st_geometry(edu_inicial) = st_transform(st_geometry(edu_inicial), 4326)
st_geometry(edu_primaria) = st_transform(st_geometry(edu_primaria), 4326)
st_geometry(edu_secundaria) = st_transform(st_geometry(edu_secundaria), 4326)
st_geometry(edu_terciaria) = st_transform(st_geometry(edu_terciaria), 4326)
########## EXTRAE COORDENADAS
edu_inicial = cargaCoords(edu_inicial)
edu_primaria = cargaCoords(edu_primaria)
edu_secundaria = cargaCoords(edu_secundaria)
edu_terciaria = cargaCoords(edu_terciaria)
####################################
####### AGREGA VARIABLES DE LA ECH A NIVEL DE CCZ
load('Bases/datosMapaLeaf.RData')
###### PEGO LA DATA
ccz = ccz %>%
left_join(capturas, by = 'ZONA_LEGAL') %>%
mutate(
content =
paste(sep = "<br/>",
paste("<b><a href='http://www.samurainoodle.com'>Centro comunal</a></b>:",ZONA_LEGAL),
paste("<b><a href='http://www.samurainoodle.com'>% Hogres pobres:</a></b>:",paste0(format(pobH,decimal = ','),'%')),
paste("<b><a href='http://www.samurainoodle.com'>% Personas pobres:</a></b>:",paste0(format(pobP,decimal = ','),'%')),
paste("<b><a href='http://www.samurainoodle.com'>Mediana ingreso hogar:</a></b>:",round(medianaIng)),
paste("<b><a href='http://www.samurainoodle.com'>Tasa desocupacion:</a></b>:",format(TD,decimal = ',')),
paste("<b><a href='http://www.samurainoodle.com'>Promedio educacion:</a></b>:",format(eduPromedio,decimal = ',')),
paste("<b><a href='http://www.samurainoodle.com'>Personas de 0 a 5 años:</a></b>:",e0_5),
paste("<b><a href='http://www.samurainoodle.com'>Personas de 6 a 14 años:</a></b>:",e6_14),
paste("<b><a href='http://www.samurainoodle.com'>Personas de 15 a 24 años:</a></b>:",e15_24),
paste("<b><a href='http://www.samurainoodle.com'>Total personas:</a></b>:",TotP)))
##############################
###### ARMA LISTAS SHAPE
listShapes = list()
shpAux = edu_inicial
listShapes[[length(listShapes) + 1]] = list(
base = shpAux %>%
mutate(content = paste("<b><a href='http://www.samurainoodle.com'>Nombre</a></b>:",NOMBRE)),
legend = list(pos = "topleft",
labels = names(table(shpAux$TIPO)),
colors = data.frame(color = c('#FF0000','#B40404','#610B0B'),row.names = names(table(shpAux$TIPO)))),
params = list(radius = 100,
opacity = 0,
fillOpacity = 1,
color = 'black',
group = 'Inicial'))
shpAux = edu_primaria
listShapes[[length(listShapes) + 1]] = list(
base = shpAux %>%
mutate(content = paste("<b><a href='http://www.samurainoodle.com'>Nombre</a></b>:",NOMBRE)),
legend = list(pos = "topleft",
labels = names(table(shpAux$TIPO)),
colors = data.frame(color = c('#FF4000','#DF7401','#FFBF00'),row.names = names(table(shpAux$TIPO)))),
params = list(radius = 100,
opacity = 0,
fillOpacity = 1,
color = 'black',
group = 'Primaria'))
shpAux = edu_secundaria
listShapes[[length(listShapes) + 1]] = list(
base = shpAux %>%
mutate(content = paste("<b><a href='http://www.samurainoodle.com'>Nombre</a></b>:",NOMBRE)),
legend = list(pos = "topleft",
labels = names(table(shpAux$TIPO)),
colors = data.frame(color = c("#F7FE2E",'#80FF00','#2EFE64'),row.names = names(table(shpAux$TIPO)))),
params = list(radius = 100,
opacity = 0,
fillOpacity = 1,
color = 'black',
group = 'Secundaria'))
shpAux = edu_terciaria
listShapes[[length(listShapes) + 1]] = list(
base = shpAux %>%
mutate(content = paste("<b><a href='http://www.samurainoodle.com'>Nombre</a></b>:",NOMBRE)),
legend = list(pos = "topleft",
labels = names(table(shpAux$TIPO)),
colors = data.frame(color = c("#00FFFF",'#2E9AFE','#642EFE'),row.names = names(table(shpAux$TIPO)))),
params = list(radius = 100,
opacity = 0,
fillOpacity = 1,
color = 'black',
group = 'Terciaria'))
names(listShapes) = do.call(c,lapply(listShapes,function(x) x$params$group))nnAlgo = names(listShapes)
####################################
####################################
####### PALETAS DE COLORES
# 'PuBu'
pal <- colorNumeric(
palette = 'Greys',
domain = ccz$pobH)
pp = leaflet(width = "100%") %>% # ABRE LA VENTANA PARA HACER EL MAPA
addTiles(group = "OSM") %>% # DEFINE UN FONDO (POR DEFECTO OSM)
addProviderTiles(providers$CartoDB.Positron, group = 'CartoDB.Positron') %>% # PONE OTRO FONDO PARA ELEGIR
addPolygons(data=ccz, fillColor = ~pal(ccz$pobH), # AGRAGA LA CAPA DE POLIGONAS DE LOS MUNICIPIOS
fillOpacity = 0.6,
weight = 0.4,
smoothFactor = 0.2, popup=~content,group = 'Pobreza') %>%
addLegend(position = c("bottomright"),pal = pal,values = ccz$pobH,title = '% hogares pobres',group = 'Pobreza')
ppp = pp
nnAlgo %>%
purrr::walk(function(df) {
ppp <<- ppp %>%
addCircles(data = listShapes[[df]]$base,lng = ~X, lat = ~Y,
radius = listShapes[[df]]$params$radius,
opacity = listShapes[[df]]$params$opacity,
fillOpacity = listShapes[[df]]$params$fillOpacity,
color = listShapes[[df]]$params$color,
fillColor = ~listShapes[[df]]$legend$color[listShapes[[df]]$base$TIPO,'color'],
popup=~content,
group = df) %>%
addLegend(position = listShapes[[df]]$legend$pos,labels = rownames(listShapes[[df]]$legend$color), colors = listShapes[[df]]$legend$color[,'color'],
title = df,
opacity = listShapes[[df]]$params$fillOpacity,
group = df)
})
ppp = ppp %>%
addLayersControl(
baseGroups = c("CartoDB.Positron","OSM"),
overlayGroups = c("Pobreza",names(listShapes)),
options = layersControlOptions(collapsed = T))
pppEs un mapa de Montevideo con una capa de Centros Comunales Zonales (CCZ) con un colormaps en escala de grises con una intensidad asociada al porcentaje de hogares pobres en el Comunal.
Se agregan 4 capas de puntos: Educación Inicial Educación Primaria Educación Secundaria o Técnica Educación Terciaria
Dentro de cada capa existen distintas tipologías de centros educativos, como ser, en la capa de educación inicial se encuentran: Centro CAIF, Comunitaria y Jardín de Infantes.
La elección de colores es circular como se muestra en la figura:
Es así que dentro de capa se intenta que los colores sean homogéneo y entre las capas sean heterogéneos.
En en el “control de capas” que aparece en el márgen superior derecho, se pueden elegir las capas que se quieran mostrar (por defecto se muestran todas). A su vez, ahí mismo se puede cambiar el fondo del mapa a la versión del Open Street Maps (OSM)
Por otro lado, cada punto y cada polígono tiene asociada una etiqueta que al hacer click se despliega y muestra la información referida. Para los centros muestra el nombre y para los polígonos información referida a ese CCZ: nombre del CCZ, porcentaje de hogares pobres, porcentajes de personas pobres, media de ingreso, etc.
Tarea 3
Tarea 3a (Realización de visualizaciones)
a1) Seleccionen algunas de las tablas de https://www.idvbook.com/teaching-aid/data-sets/ (por ejemplo, la tabla “2004 Cars and Trucks Data Set”).
a2) Utilicen información de su interés, o busquen en repositorios de información públicos, información estadística de Uruguay. Podría ser información sobre las elecciones internas, nacionales, municipales en Uruguay, o información sobre composición o información nutricional de productos alimenticios. Ejemplos: http://www.ine.gub.uy/ https://www.uruguayxxi.gub.uy/es/centro-informacion/
- Importen la información a Octave para su procesamiento posterior. Probablemente deberá modificar la información disponible (cambiar los nombres por códigos numéricos, etc.) previo a su importación, para facilitar el procesamiento posterior.
- Busquen relaciones visuales entre las distintas columnas de las tablas. Brinden alguna explicación intuitiva a dichas relaciones. Utilice plotmatrix() o algún otro comando para realizar las visualizaciones.
- Gráficos de datos multivariados: Muestren un gráfico donde 3, 4 o más variables se utilicen al mismo tiempo. Brinden dos o más visualizaciones alternativas para los mismos datos. Analice qué aspectos se resaltan y cuales quedan ocultos en cada uno de ellas.
3.a)
Se utilizan datos del Instituto Nacional de Evaluación Educativa (INEED) disponibles en: https://www.ineed.edu.uy/nuestro-trabajo/bases-de-datos/388-aristas-2017-tercero-y-sexto-de-educacion-primaria.html
Se quier mostrar la relación entre dos variables a través de un gráfico de puntos con agregados:
- categorías de una variable nominal
- información de una variable contínua y
- las distribuciones marginales
load('Bases/Datos_Estudiantes_CXTO_6TO.RData')
dat = Indices %>%
dplyr::select(IdCentroDes,categoria,theta_MAT_E300,theta_LEN_E300,ESCS_IMP) %>%
group_by(IdCentroDes,categoria) %>%
summarise_all(mean,na.rm = T) %>%
filter(!categoria %in% c('RURAL','TiempoExtendido')) %>%
ungroup() %>%
mutate(ESCS_IMP_est = (ESCS_IMP-mean(ESCS_IMP,na.rm = T))/sd(ESCS_IMP,na.rm = T))
X = 'ESCS_IMP_est'
Y = 'theta_MAT_E300'
sizeVar = 'theta_LEN_E300'
Marca = 'categoria'
smoothMethod = 'lm'
alphaPoints = 0.4
bins = 50
xmin = -3
xmax = 3
ymin = 200
ymax = 400
pp = ggplot(dat, aes_string(x = X, y = Y, color = Marca)) +
xlim(xmin,xmax) + ylim(ymin,ymax) +
geom_point(aes_string(size = sizeVar),alpha = alphaPoints) + theme_minimal() +
theme(legend.justification=c(0,0), legend.position=c(0,0)) +
scale_radius(name = 'Puntaje en\nLengua',breaks = seq(250,350,25),range = c(1,10)) +
scale_colour_manual(name = 'Tipo de\ncentro',values = c('#B40404','#FF8000','#088A08','#0000FF','#2E2E2E')) +
guides(colour = guide_legend(override.aes = list(size=4)))
#######################################################
#### REGRESION POLINOMICA EN X
pp = pp + geom_smooth(aes_string(x = X, y = Y), method = smoothMethod, se = FALSE,show.legend = F)
#######################################################
##### AGREGA MARGINALES
htop <- ggplot(dat, aes_string(x=X)) +
geom_histogram(aes(y=..density..), fill = "white", color = "black", bins=bins) + xlab('Nivel socio económico del centro') +
stat_density(colour = "blue",fill = 'blue',size = 0,alpha = alphaPoints, geom="density", size = 1, position="identity", show.legend=FALSE) + xlim(xmin,xmax) +
theme_minimal() + theme(axis.title.y = element_blank(),axis.text.y=element_blank())
scatter <- pp + labs(x=X, y=Y) +
theme(axis.title.y = element_blank(),
axis.title.x = element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank())
hright <- ggplot(dat, aes_string(x=Y)) +
geom_histogram(aes(y=..density..), fill = "white", color = "black", bins=bins) +
xlim(ymin,ymax) + xlab('Puntaje promedio del centro en Matemática') +
stat_density(colour = "red",size = 0,fill = 'red',alpha = alphaPoints, geom="density", size = 1, position="identity", show.legend=FALSE) +
coord_flip() +
theme_minimal() +
theme(axis.title.x = element_blank(),axis.text.x=element_blank())
Rep = 4
matr = rbind(c(rep(1,Rep),NA),
c(rep(2,Rep),3),
c(rep(2,Rep),3),
c(rep(2,Rep),3),
c(rep(2,Rep),3))
grid.arrange(htop, scatter, hright, layout_matrix = matr) Muestra la relación entre el nivel socioeconómico de los Centros Educativos en la muestra y el puntaje promedio en matemáticas obtenido por los estudiantes en cada centro.
Los colores distinguen los tipos de centros: Aprender, PR-HP (de práctica), Priv (privado), TC (tiempo completo) y UC (urbana común). El tamaño del círculo se corresponde con el puntaje promedio del centro en lengua.
Por lo tanto se ve conjuntamente:
- nivel socioeconómico del centro
- puntaje en lengua del centro
- puntaje en matemáticas del centro y
- tipo de centro
Se agregan las marginales: distribución del putnaje promedio en MAtemáticas y el nivel socioeconómico del centro y las rectas de regresión lineal para cada tipo de centro. De esta forma se puede chequear si el efecto del nivel socioeconómico es similar en cada tipo de centro.
Tarea 3b (Realización de visualizaciones de grafos)
- Seleccionen alguna de las tablas de: https://github.com/gephi/gephi/wiki/Datasets https://dhs.stanford.edu/gephi-workshop/sample-graph-data/ o busquen y generen información de su interés.
- Importen la información a Gephi para su procesamiento posterior.
- Muestre un grafo donde 3 o más variables participen al mismo tiempo. Brinde dos o más visualizaciones alternativas para los mismos datos. Analice qué aspectos se resaltan y cuales quedan ocultos en cada una de ellas.
- Genere archivos pdf, svg u otros para adjuntar al informe.
Dataset: EUROSIS Webmapping
El estudio de mapeo web EuroSiS es un mapeo de interacciones entre actores de laScience in Society de 12 países europeos.Este estudio se basa únicamente en la Web. Como consecuencia, no muestra los componentes “reales” de cada estado miembro, sino las interacciones dinámicas entre los protagonistas de base en la Web.Los actores representados en los nodos se definen como una organización involucrada en la Science In Society. Debido a que se utiliza la web para extraer información, un actor siempre está representado por un sitio web. Por lo que el tamaño del nodo irá en función de la cantidad de sitios web que tenga asociado cada actor (organización).
La conexión (aristas) entre dichos nodos se originan por la cantidad de enlaces (hipervinculos) Si un sitio web tiene una alta conectividad, tiene muchos enlaces . La conectividad interna de un conjunto de sitios web representa la cantidad de enlaces entre estos sitios web, mientras que la conectividad externa representa la cantidad de enlaces entre sitios web dentro y fuera del conjunto.
De esta forma se obtiene el siguiente grafo que mapea las relaciones entre los distintos actores de la comunidades científicas de los 12 países analizados:
La primera dificultad en esta visualización está relacionada con el tamaño de los países. Los países grandes proponen actores más relevantes (y sitios web) que los países pequeños. A lo que se agrega un segundo problema que es los países que no participaron. Esto afecta la conectividad de los países más pequeños. La mayoría de los países grandes tienen muchas interacciones con otros países.
Vemos que los actores interactúan más dentro del mismo país, y esto se ve reforzado por el hecho de que, en la web, los diferentes idiomas tienden a separarse (y los países europeos tienen muchos idiomas diferentes).Para entender cómo interactúan los actores conviene que mirar dentro de cada país. Para lo cual utilizamos el siguiente filtro para visualizar los actores y relaciones de un país solo, en este caso de Armenia:
Tarea 3c (Realización de visualizaciones con Paraview)
- Cargue el archivo de visualización que contiene la geometría de parte de una ciudad y sus temperaturas por hora. Analice los resultados y comente la evolución de la temperatura a través del día.
- Elija una hora de la tarde (entre 13:00 y 18:00) y ajuste la barra de colores (colorbar) para visualizar las temperaturas en esa hora de la mejor manera que pueda. Justifique.
- Busque un lugar y una dirección de la cámara que permita observar los datos de una manera que entienda interesante. Justifique.
- Utilice el filtro “Plot Over Line” para mostrar la gráfica de la evolución de la temperatura a través de una línea. Seleccione una línea de interés y analice los resultados de la gráfica. Utilice el filtro “Clip” para recortar la geometría. Retire los edificios de un lado de la calle para poder visualizar mejor los edificios del otro lado.
- OPCIONAL: utilice los múltiples datos para realizar una animación donde se muestre la evolución de la temperatura urbana en el día.
De las imágenes se aprecia como cambia la temperatura según sea de día o de noche.
Se observa que el momento del día con temperatura más baja es al amanecer, comenzando a subir hasta la tarde que tiene su pico máximo.
Trabajamos con las 14:00hs.
La elección del colormaps se corresponde con que se aprecian facilmente las diferencias de temperatura según sean lugares donde se recibe más sol como los techos y algunas paredes, así como lugares sombreados, por ejemplo por las sombras de los edificios.
La ubicación de la cámara permite ver el interior de las callecitas rodeada de edificios. En ella se distinguen distintas temperaturas según sea la orientación de la pared así como la altura al piso, esto es, las partes cercanas al techo están más calientes que las cercanas al piso.
Por otra parte, se observa más temperatura en las bocacalles y en las ventanas.
El filtro “Plot Over Line” fue aplicado tratando de evaluar el cambio en la temperatura en una pared de un edificio. Se corrobora que la temperatura cercana al piso (menor mts) es la más baja, sube cuando se despega un poco del piso, se mantiene constante en el trayecto de pared hasta que encuentra un punto asociado al techo, dónde se alcanza la mayor temperatura.
El corte se hace para tratar de entender las variaciones de temperatura en las partes que no están a simple vista (aunque se rote la vista). De esta forma se ve como cambia la temperatura en las calles internas.